package cn.demoncat.util.email.entity;

import cn.demoncat.util.lang.ParamEmptyUtil;
import cn.demoncat.util.lang.entity.FileUrl;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 邮件参数
 * 
 * @author 延晓磊
 *
 * @since 2019年4月2日
 */
@Data
public class EmailArg {
	
	// 是否为HTML邮件：false = TEXT，true = HTML
	private Boolean html = false;
	// 是否为模板邮件：false = 直接发送，true = 模板渲染(FreeMarker)
	private Boolean template = false;
	// 邮件的发送人（如果为空，将使用email.sender配置）
	private String sender;
	// 邮件的主题：主题、模板文本
	private String subject;
	// 邮件的内容：文本、Html、模板文本（如果为空将尝试模板文件渲染）
	private String content;
	// 邮件模板文件目录：前缀/后缀非/；默认为模板根目录（通过email.template配置），如果非空，将拼接在根目录之后
	private String templateDir;
	// 邮件模板文件名称：前缀非/；相对于模板目录，通常以.ftl后缀，如tmp.ftl
	private String templateFile;
	// 邮件模板渲染数据
	private Object templateData;
	// 邮件的附件：非空时带附件
	private List<FileUrl> files;
	// 接收者（1个发送失败，全部失败）
	private String[] to;
	
	/**
	 * 构建HTML邮件参数
	 * 
	 * @param to		接收者列表（1个发送失败，全部失败）
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月16日
	 */
	public static EmailArg buildHtml(String ...to) {
		EmailArg arg = new EmailArg();
		arg.setHtml(true);
		arg.setTo(to);
		// 参数校验
		ParamEmptyUtil.check(ArrayUtils.isNotEmpty(arg.getTo()));
		return arg;
	}
	
	/**
	 * 构建TEXT邮件参数
	 * 
	 * @param to		接收者列表（1个发送失败，全部失败）
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月16日
	 */
	public static EmailArg buildText(String ...to) {
		EmailArg arg = new EmailArg();
		arg.setHtml(false);
		arg.setTo(to);
		// 参数校验
		ParamEmptyUtil.check(ArrayUtils.isNotEmpty(arg.getTo()));
		return arg;
	}

	/**
	 * 设置发送人
	 *
	 * @param sender
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年12月16日
	 */
	public EmailArg addSender(String sender){
		this.sender = sender;
		return this;
	}
	
	/**
	 * 添加邮件主题和内容（非模板渲染）
	 * 
	 * @param subject	邮件的主题
	 * @param content	邮件的内容
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月16日
	 */
	public EmailArg addContent(String subject, String content) {
		this.subject = subject;
		this.content = content;
		// 不使用模板渲染
		this.template = false;
		this.templateDir = null;
		this.templateFile = null;
		// 参数校验
		ParamEmptyUtil.checkBlank(subject,content);
		return this;
	}
	
	/**
	 * 添加邮件主题和内容（模板文本渲染）
	 * 
	 * @param subject		邮件主题模板文本
	 * @param content  		邮件内容模板文本
	 * @param templateData	邮件模板渲染数据，通过FreeMarker渲染
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月16日
	 */
	public EmailArg addTemplate(String subject, String content, Object templateData) {
		this.subject = subject;
		this.content = content;
		this.templateData = templateData;
		// 使用模板渲染
		this.template = true;
		this.templateDir = null;
		this.templateFile = null;
		// 参数校验
		ParamEmptyUtil.checkBlank(subject,content);
		return this;
	}
	
	/**
	 * 添加邮件主题和模板（模板文件渲染）
	 * 
	 * @param subject		邮件主题模板文本
	 * @param templateDir	邮件模板文件目录：前缀/后缀非/；默认为模板根目录（通过email.template配置），如果非空，将拼接在根目录之后
	 * @param templateFile  邮件模板文件名称：前缀非/；相对于模板目录，通常以.ftl后缀，如tmp.ftl
	 * @param templateData	邮件模板渲染数据，通过FreeMarker渲染
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月16日
	 */
	public EmailArg addTemplateFile(String subject, String templateDir, String templateFile, Object templateData) {
		this.subject = subject;
		this.templateDir = templateDir;
		this.templateFile = templateFile;
		this.templateData = templateData;
		// 使用模板渲染
		this.template = true;
		this.content = null;
		// 参数校验
		ParamEmptyUtil.checkBlank(subject,templateFile);
		return this;
	}
	
	/**
	 * 添加邮件主题和模板（模板文件渲染）
	 * 
	 * @param subject		邮件主题模板文本
	 * @param templateFile	邮件模板文件名称：前缀非/；相对于模板目录，通常以.ftl后缀，如tmp.ftl
	 * @param templateData	邮件模板渲染数据，通过FreeMarker渲染
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月16日
	 */
	public EmailArg addTemplateFile(String subject, String templateFile, Object templateData) {
		return addTemplateFile(subject, null, templateFile, templateData);
	}

	/**
	 * 添加邮件附件
	 *
	 * @param files		邮件的附件
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年12月16日
	 */
	public EmailArg addFile(List<FileUrl> files) {
		this.files = files;
		return this;
	}

	/**
	 * 添加邮件附件
	 * 
	 * @param name
	 * @param url
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月16日
	 */
	public EmailArg addFile(String name, String url) {
		if (CollectionUtils.isEmpty(this.files)) {
			this.files = new ArrayList<>();
		}
		this.files.add(FileUrl.build(name, url));
		return this;
	}
	

}
